package br.com.controller.aula;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;


import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.arquitetura.utils.NotaAluno;
import br.com.data.hibernate.AulaHibernateDAO;
import br.com.data.hibernate.AvaliacaoHibernateDAO;
import br.com.data.hibernate.DesempenhoHibernateDAO;
import br.com.data.hibernate.ProgressoHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Aula;
import br.com.model.entidade.Avaliacao;
import br.com.model.entidade.Progresso;
import br.com.model.entidade.Desempenho;

@ManagedBean
@ViewScoped
public class MBGerenciarDesempenho extends AbstractMBean<Progresso>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Progresso progresso;
	private Aula aula;
	private AulaHibernateDAO aulaHibernateDAO;
	private AvaliacaoHibernateDAO avaliacaoHibernateDAO;
	private DesempenhoHibernateDAO desempenhoHibernateDAO;
	private List<NotaAluno> listaNotaAluno;
	private Avaliacao avaliacao;
	
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public void cadastrarDesempenho(){
		Desempenho desempenho = new Desempenho();
		//recuperar o progreso de cada aluno e adicionar o desempenho de cada um no bimestre
		
		ProgressoHibernateDAO progressoHibernateDAO = (ProgressoHibernateDAO) getBean("progressoHibernateDAO");
		
		for (NotaAluno n : listaNotaAluno) {
			progresso = progressoHibernateDAO.buscarProgresso(n.getAluno(), aula);
			desempenho.setAvaliacao(avaliacao);
			desempenho.setNota(n.getNota());
			desempenho.setProgresso(progresso);
			//Realizar a verificacao do semestre corrente
			//inserir o desempenho na lista de notas do semstre vigente
			serviceCadastro.salvar(desempenho);
		}
	}
	
	
	public MBGerenciarDesempenho(){
		this.listaNotaAluno = new ArrayList<NotaAluno>();
		
		this.aulaHibernateDAO = (AulaHibernateDAO) getBean("aulaHibernateDAO");
		this.avaliacaoHibernateDAO = (AvaliacaoHibernateDAO) getBean("avaliacaoHibernateDAO");
		this.desempenhoHibernateDAO = (DesempenhoHibernateDAO) getBean("desempenhoHibernateDAO");
		
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		Long idAula = (Long) session.getAttribute("idAulaVizualizacao");
		Long idAvaliacao = (Long) session.getAttribute("idAvaliacao");
		
		if(idAula == null || idAvaliacao ==null){
			try {
				FacesContext.getCurrentInstance().getExternalContext().redirect("/educacao/pages/professor/index.jsf");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			this.aula = aulaHibernateDAO.getById(Aula.class, idAula);
			this.avaliacao = avaliacaoHibernateDAO.getById(Avaliacao.class, idAvaliacao);
			NotaAluno n = new NotaAluno();
			for (Aluno a : aula.getTurma().getAlunos()) {
				n.setAluno(a);
				listaNotaAluno.add(n);
			}
		}
	}


	public List<NotaAluno> getListaNotaAluno() {
		return listaNotaAluno;
	}

	public void setListaNotaAluno(List<NotaAluno> listaNotaAluno) {
		this.listaNotaAluno = listaNotaAluno;
	}

	
	public Aula getAula() {
		return aula;
	}
	public void setAula(Aula aula) {
		this.aula = aula;
	}
	public AulaHibernateDAO getAulaHibernateDAO() {
		return aulaHibernateDAO;
	}
	public void setAulaHibernateDAO(AulaHibernateDAO aulaHibernateDAO) {
		this.aulaHibernateDAO = aulaHibernateDAO;
	}
	public AvaliacaoHibernateDAO getAvaliacaoHibernateDAO() {
		return avaliacaoHibernateDAO;
	}
	public void setAvaliacaoHibernateDAO(AvaliacaoHibernateDAO avaliacaoHibernateDAO) {
		this.avaliacaoHibernateDAO = avaliacaoHibernateDAO;
	}

	public Progresso getProgresso() {
		return progresso;
	}

	public void setProgresso(Progresso progresso) {
		this.progresso = progresso;
	}

	public Avaliacao getAvaliacao() {
		return avaliacao;
	}

	public void setAvaliacao(Avaliacao avaliacao) {
		
		this.avaliacao = avaliacao;
		
	}

	
	
}
